﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОписаниеПеременных

Перем ЗначениеИзменено;

#КонецОбласти

#Область ОбработчикиСобытий

Процедура ПередЗаписью(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	ЗначениеИзменено = Значение <> Константы.ИспользоватьВнешнихПользователей.Получить();
	
	Если ЗначениеИзменено
	   И Значение
	   И Не ПользователиСлужебный.ВнешниеПользователиВнедрены() Тогда
		ВызватьИсключение НСтр("ru = 'Использование внешних пользователей не предусмотрено в программе.'");
	КонецЕсли;
	
КонецПроцедуры

Процедура ПриЗаписи(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	Константы.ИспользоватьГруппыВнешнихПользователей.Обновить();
	
	Если ЗначениеИзменено Тогда
		ПользователиСлужебный.ОбновитьРолиВнешнихПользователей();
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
			МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
			МодульУправлениеДоступом.ОбновитьРолиПользователей(Тип("СправочникСсылка.ВнешниеПользователи"));
			
			МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный");
			Если МодульУправлениеДоступомСлужебный.ОграничиватьДоступНаУровнеЗаписейУниверсально() Тогда
				ПараметрыПланирования = МодульУправлениеДоступомСлужебный.ПараметрыПланированияОбновленияДоступа();
				ПараметрыПланирования.ДляПользователей = Ложь;
				ПараметрыПланирования.ДляВнешнихПользователей = Истина;
				ПараметрыПланирования.ЭтоПродолжениеОбновления = Истина;
				ПараметрыПланирования.Описание = "ИспользоватьВнешнихПользователейПриЗаписи";
				МодульУправлениеДоступомСлужебный.ЗапланироватьОбновлениеДоступа(, ПараметрыПланирования);
			КонецЕсли;
		КонецЕсли;
		Если Значение Тогда
			ПользователиСлужебный.УстановитьРеквизитПоказыватьВСпискеВыбораУВсехПользователейИБ(Ложь);
		Иначе
			ОчиститьРеквизитВходВПрограммуРазрешенУВсехВнешнихПользователей();
		КонецЕсли;
		
		УстановитьПризнакИспользованияНабораСвойств();
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// У всех пользователей ИБ очищает реквизит ПризнакПоказыватьВСписке.
Процедура ОчиститьРеквизитВходВПрограммуРазрешенУВсехВнешнихПользователей()
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ВнешниеПользователи.ИдентификаторПользователяИБ КАК Идентификатор
	|ИЗ
	|	Справочник.ВнешниеПользователи КАК ВнешниеПользователи";
	Идентификаторы = Запрос.Выполнить().Выгрузить();
	Идентификаторы.Индексы.Добавить("Идентификатор");
	
	ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей();
	Для Каждого ПользовательИБ Из ПользователиИБ Цикл
		
		Если Идентификаторы.Найти(ПользовательИБ.УникальныйИдентификатор, "Идентификатор") <> Неопределено
		   И Пользователи.ВходВПрограммуРазрешен(ПользовательИБ) Тогда
			
			ПользовательИБ.АутентификацияСтандартная    = Ложь;
			ПользовательИБ.АутентификацияOpenID         = Ложь;
			ПользовательИБ.АутентификацияOpenIDConnect  = Ложь;
			ПользовательИБ.АутентификацияТокеномДоступа = Ложь;
			ПользовательИБ.АутентификацияОС             = Ложь;
			ПользовательИБ.Записать();
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Процедура УстановитьПризнакИспользованияНабораСвойств()
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		Возврат;
	КонецЕсли;
	МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
	
	ПараметрыНабора = МодульУправлениеСвойствами.СтруктураПараметровНабораСвойств();
	ПараметрыНабора.Используется = Значение;
	МодульУправлениеСвойствами.УстановитьПараметрыНабораСвойств("Справочник_ВнешниеПользователи", ПараметрыНабора);
	
КонецПроцедуры

#КонецОбласти

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли